package com.youth.oauth.config.security;

import cn.hutool.json.JSONUtil;
import com.youth.oauth.commons.beans.Result;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 登录认证未通过的处理类
 * 当用户尝试访问需要认证的资源但未提供有效凭证时，此处理器将负责处理相关请求
 */
@Component
public class LoginUnAuthenticationEntryPointHandler implements AuthenticationEntryPoint {
    /**
     * 处理认证未通过的请求
     *
     * @param request 请求对象，包含请求相关的信息
     * @param response 响应对象，用于向客户端发送响应
     * @param authException 认证异常，包含认证失败的原因
     * @throws IOException 当处理输入输出操作时发生错误
     * @throws ServletException 当处理Servlet操作时发生错误
     */
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        // 设置响应的字符编码和内容类型，确保响应信息的正确显示
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");

        // 创建一个错误响应，提示用户需要重新登录
        Result result = Result.error("用户未认证或登录已过期，请重新登录后再访问");

        // 将错误响应对象转换为JSON字符串，以便在网络中传输
        String json = JSONUtil.toJsonStr(result);

        // 向客户端发送JSON格式的错误信息
        response.getWriter().write(json);
    }
}
